package my.mark.mybaibaoxiang.juc.biji07.Atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author wxming.
 * @description: TODO ABA问题
 * 比方主线程由于睡眠了一下，不知道干扰线程将某个数加一又减一了，
 * 主线程不知道干扰线程做过修改，便产生了ABA问题。
 * 比方金融钱，被挪用了又还回去了。
 * 解决：给数据加版本号。AtomicStampedRerence提供用于解决aba问题。
 */
public class AtomicAbaProblemTest {
    static AtomicInteger atomicInteger = new AtomicInteger(1);

    public static void main(String[] args) {
        Thread main = new Thread(new Runnable() {
            @Override
            public void run() {
                int a = atomicInteger.get();
                System.out.println("操作线程" + Thread.currentThread().getName() + "--修改前操作数值:" + a);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                boolean isCasSuccess = atomicInteger.compareAndSet(a, 2);//如果还是a没变，便修改成功。（此处由于睡眠了一下，不知道干扰线程将这个数加一又减一了，主线程不知道干扰线程做过修改，便产生了ABA问题。比方金融钱，被挪用了又还回去了。解决：给数据加版本号。AtomicStampedRerence提供用于解决aba问题。）
                if (isCasSuccess) {
                    System.out.println("操作线程" + Thread.currentThread().getName() + "--Cas修改后操作数值:" + atomicInteger.get());
                } else {
                    System.out.println("CAS修改失败");
                }

            }
        }, "主线程");

        Thread other = new Thread(new Runnable() {
            @Override
            public void run() {
                atomicInteger.incrementAndGet();// 1+1 = 2;自加。
                System.out.println("操作线程" + Thread.currentThread().getName() + "--increase后值:" + atomicInteger.get());
                atomicInteger.decrementAndGet();// atomic-1 = 2-1;自减。
                System.out.println("操作线程" + Thread.currentThread().getName() + "--decrease后值:" + atomicInteger.get());
            }
        }, "干扰线程");

        main.start();
        other.start();

    }
}
